﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Rendiciones.Logica.Enumeradores;
using Rendiciones.Logica.Modelos;
using Rendiciones.Logica.Servicios;
using Rendiciones.Web.infraestructura;
using Tesla.Excepciones;
using Tesla.Validador;

namespace Rendiciones.Web.Custodio
{
    public partial class EnviarRendicion : PageBase
    {
        private static ServGastos _servGastos;
        public Usuario usuario;
        public Rendicion rendicion;
        private static Validador _validador;
        public List<Proyecto> _proyectos;

        protected void Page_Load(object sender, EventArgs e)
        {
            Button btnYes = (Button)ctrlVerGasto.FindControl("BtnAceptar");
            btnYes.Click += new EventHandler(ctrlAgregarGasto_btnYes_Click);
            usuario = (Usuario)Session["usuario"];
            if (usuario == null) Response.Redirect("~/IniciarSesion.aspx");

            _validador = new Validador();

            if (!IsPostBack)
            {
                txtFondoAsignado.Text = usuario.SaldoAsignado.ToString();
                txtSaldo.Text = usuario.Saldo.ToString();

                Session["datasource"] = null;
                LimpiarErrores(pnlRendicion);
                _servGastos = new ServGastos();
                DropDownList1.DataTextField = "Nombre";
                DropDownList1.DataValueField = "IdProyecto";
                CargarCombos();

                hfIdRendicion.Value = (string)Session["RendicionParaCargar"];
                if (!string.IsNullOrEmpty(hfIdRendicion.Value))
                {
                    rendicion = _servGastos.CargarRendicionPorId(int.Parse(hfIdRendicion.Value));
                    rendicion.DetallesGasto = _servGastos.BuscarGastosDeRendicion(int.Parse(hfIdRendicion.Value));
                    CargarRendicionSolicitada(rendicion);
                    Session["RendicionParaCargar"] = null;
                }
            }
        }

        void ctrlAgregarGasto_btnYes_Click(object sender, EventArgs e)
        {
            Session["index"] = null;
        }

        public void CargarCombos()
        {
            _proyectos = _servGastos.TodosLosProyectosAsociados(usuario.IdUsuario, ERol.Custodio);
            DropDownList1.DataSource = _proyectos;
            DropDownList1.DataBind();
        }

        protected void btnImprimir_Click(object sender, EventArgs e)
        {
            
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            Response.Redirect("EnviarAOficinaCentral.aspx");
        }

        protected void btnEnviar_Click(object sender, EventArgs e)
        {
            try
            {
                Modulos.Rendiciones.WorkFlows.Salida(int.Parse(hfIdRendicion.Value), EEstadoRendicion.DeclaracionDeRendicionPorCustodio, DateTime.Now);

                _servGastos.ActualizaEstadoRendicion((int)EEstadoRendicion.AprobacionEnContabilidad, int.Parse(hfIdRendicion.Value));

                var proyecto = Modulos.Rendiciones.Proyectos.Leer(rendicion.IdProyecto);
                Modulos.Rendiciones.WorkFlows.Entrada(int.Parse(hfIdRendicion.Value), EEstadoRendicion.AprobacionEnContabilidad, DateTime.Now, proyecto.IdAdministrador, UsuarioConectado.IdUsuario);

                MostrarOk("Rendicion Enviada Satisfactoriamente", "~/Custodio/Menu.aspx");
                
            }
            catch (ResultadoValidacionException resultadoValidacionException)
            {
                MuestraErroresDeValidacion(pnlRendicion, true, resultadoValidacionException);
            }

        }

        protected void grRendicion_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            var index = int.Parse(e.CommandArgument.ToString());

            Session["index"] = index;

            if (e.CommandName == "Editar")
            {
                var gastos = (List<Gasto>)Session["datasource"];
                var gasto = gastos[index];
                ctrlVerGasto.NroGasto = (index + 1).ToString();
                ctrlVerGasto.CargaDatosAPopup(gasto);
            }
        }

        public void CargarRendicionSolicitada(Rendicion rendicion)
        {
            hfIdRendicion.Value = rendicion.IdRendicion.ToString();
            Session["datasource"] = rendicion.DetallesGasto;
            DropDownList1.SelectedIndex = rendicion.IdProyecto;
            txtCentroCosto.Text = rendicion.CentroCosto;
            txtFondoAsignado.Text = rendicion.FondoAsignado.ToString();
            txtSaldo.Text = rendicion.Saldo.ToString();

            grRendicion.DataSource = rendicion.DetallesGasto;
            grRendicion.DataBind();

        }
        
        public void Validar(Rendicion rendicion)
        {
            var mensajesDeValidacion = _validador.Valida(rendicion, new Dictionary<string, object>()).ToList();
            if (!_validador.EsValido)
                throw new ResultadoValidacionException("Hay campos incompletos o que deben ser modificados", mensajesDeValidacion);
        }
        
    }
}